package com.escape;

import com.Student;

/**
 * @author: csh
 * @Date: 2021/4/21 11:01
 * @Description:线程逃逸
 */
public class ThreadEscape {

    public static Integer sum=0;


    
    /**
     *  详细日志
     *  -XX:+PrintGCDetails
     *  简单日志
     *  -XX:+PrintGC
     *
     * 功能描述: -XX:+PrintGC -Xms5M -Xmn5M -XX:+DoEscapeAnalysis
     *
     * @param:
     * @return:
     * @auther: csh
     * @date: 2021/4/21 13:48
     */
    public static void main(String[] args) throws InterruptedException {
        //-XX:-DoEscapeAnalysis 未开启锁消除 234毫秒  //-XX:+DoEscapeAnalysis 开启则128毫秒
//        long start = System.currentTimeMillis();
//        for(int i =0;i<5_000_000;i++){
//            escape("a", "b");
//        }
//        long end = System.currentTimeMillis();
//        System.out.println("耗时"+(end-start)+"毫秒");

        //-XX:-DoEscapeAnalysis 313毫秒 -XX:+DoEscapeAnalysis 开启：273毫秒
//        long start = System.currentTimeMillis();
//        for(int i =0;i<5_000_000;i++){
//           new ThreadEscape().noEscape("a", "b");
//        }
//        long end = System.currentTimeMillis();
//        System.out.println("耗时"+(end-start)+"毫秒");

        //-XX:-DoEscapeAnalysis 关闭:53毫秒 -XX:+DoEscapeAnalysis 开启:43毫秒
//        long start = System.currentTimeMillis();
//        for(int i =0;i<5_000_000;i++){
//            new ThreadEscape().setSum(i);
//        }
//        long end = System.currentTimeMillis();
//        System.out.println("耗时"+(end-start)+"毫秒");

        //-XX:-DoEscapeAnalysis 关闭:145毫秒 -XX:+DoEscapeAnalysis 开启:8毫秒
//        long start = System.currentTimeMillis();
//        for(int i =0;i<5_000_000;i++){
//            new ThreadEscape().newLockNoEscape();
//        }
//        long end = System.currentTimeMillis();
//        System.out.println("耗时"+(end-start)+"毫秒");

        long start = System.currentTimeMillis();
        for(int i=0;i<5000000;i++){
            newObject();
        }
//        for(int i =0;i<5000000;i++){
//            newObject2();
//        }
        long end = System.currentTimeMillis();
        System.out.println("耗时"+(end-start)+"毫秒");
        Thread.sleep(100000);
    }


    /**
     *
     * 功能描述: 全局变量赋值发生逃逸
     *
     * @param:
     * @return:
     * @auther: csh
     * @date: 2021/4/21 14:23
     */
    public void setSum(Integer number){
        sum = number;
    }

    /**
     *
     * 功能描述: 线程逃逸，因为该StringBuffer 会将结果返回，可能被其他地方所引用
     *
     * @param:
     * @return:
     * @auther: csh
     * @date: 2021/4/21 11:03
     */
    public static StringBuffer escape(String s1, String s2){
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(s1);
        stringBuffer.append(s2);
        return stringBuffer;
    }

    /**
     *
     * 功能描述: 未发生逃逸
     *
     * @param:
     * @return:
     * @auther: csh
     * @date: 2021/4/21 11:05
     */
    public  void noEscape(String s1,String s2){
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(s1);
        stringBuffer.append(s2);
    }

    /**
     *
     * 功能描述: 创建线程可见，但对象无法逃逸
     *
     * @param:
     * @return:
     * @auther: csh
     * @date: 2021/4/21 14:30
     */
    public void newLockNoEscape(){
        //创建线程可见，但对象无逃逸
        synchronized (new Object()){

        }
        //创建线程可见，但对象无逃逸
        Object noEscape = new Object();
    }

    /**
     *
     * 功能描述: 方法逃逸
     *
     * @param:
     * @return:
     * @auther: csh
     * @date: 2021/4/22 11:55
     */
    public static Object newObject(){
        return new Object();
    }

    /**
     *
     * 功能描述: 没有逃逸
     *
     * @param:
     * @return:
     * @auther: csh
     * @date: 2021/4/22 11:55
     */
    public static void newObject2(){
        new Object();
    }


}
